package com.example.common;

import com.example.common.enums.ResultCodeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 统一结果返回类，用于封装接口返回的数据格式
 * 包含状态码、消息描述和实际数据三个字段
 */
@Data
public class Result {
    private String code;
    private String message;
    private Object data;

    /**
     * 带数据的构造函数
     * @param data 返回的数据对象
     */
    private Result(Object data) {
        this.data = data;
    }

    /**
     * 默认无参构造函数
     */
    public Result() {
    }

    /**
     * 创建成功的返回结果（无数据）
     * @return 成功的Result对象，状态码为SUCCESS，消息为成功描述
     */
    public static Result success() {
        Result tResult = new Result();
        tResult.setCode(ResultCodeEnum.SUCCESS.code);
        tResult.setmessage(ResultCodeEnum.SUCCESS.message);
        return tResult;
    }

    /**
     * 创建成功的返回结果（带数据）
     * @param data 成功时返回的数据对象
     * @return 成功的Result对象，包含指定数据，状态码为SUCCESS，消息为成功描述
     */
    public static Result success(Object data) {
        Result tResult = new Result (data);
        tResult.setCode(ResultCodeEnum.SUCCESS.code);
        tResult.setmessage(ResultCodeEnum.SUCCESS.message);
        return tResult;
    }

    /**
     * 创建错误的返回结果（使用系统默认错误码）
     * @return 错误的Result对象，状态码为SYSTEM_ERROR，消息为系统错误描述
     */
    public static Result error() {
        Result tResult = new Result();
        tResult.setCode(ResultCodeEnum.SYSTEM_ERROR.code);
        tResult.setmessage(ResultCodeEnum.SYSTEM_ERROR.message);
        return tResult;
    }

    /**
     * 创建错误的返回结果（自定义错误码和消息）
     * @param code 自定义错误状态码
     * @param message 自定义错误消息描述
     * @return 错误的Result对象，包含指定的错误码和消息
     */
    public static Result error(String code, String message) {
        Result tResult = new Result();
        tResult.setCode(code);
        tResult.setmessage(message);
        return tResult;
    }

    /**
     * 创建错误的返回结果（使用枚举定义的错误码）
     * @param resultCodeEnum 错误码枚举对象，包含预定义的错误码和消息
     * @return 错误的Result对象，状态码和消息来自指定的枚举值
     */
    public static Result error(ResultCodeEnum resultCodeEnum) {
        Result tResult = new Result();
        tResult.setCode(resultCodeEnum.code);
        tResult.setmessage(resultCodeEnum.message);
        return tResult;
    }

    /**
     * 获取状态码
     * @return 状态码字符串
     */
    public String getCode() {
        return code;
    }

    /**
     * 设置状态码
     * @param code 状态码字符串
     */
    public void setCode(String code) {
        this.code = code;
    }

    /**
     * 获取消息描述
     * @return 消息描述字符串
     */
    public String getmessage() {
        return message;
    }

    /**
     * 设置消息描述
     * @param message 消息描述字符串
     */
    public void setmessage(String message) {
        this.message = message;
    }

    /**
     * 获取返回数据
     * @return 返回的数据对象
     */
    public Object getData() {
        return data;
    }

    /**
     * 设置返回数据
     * @param data 返回的数据对象
     */
    public void setData(Object data) {
        this.data = data;
    }
}

